% TODO proof-reading
\subsection{Битовые поля}


Все побитовые операции работают также, как и в любой другой \ac{ISA}:

\begin{lstlisting}[style=customjava]
	public static int set (int a, int b) 
	{
		return a | 1<<b;
	}

	public static int clear (int a, int b) 
	{
		return a & (~(1<<b));
	}
\end{lstlisting}

\begin{lstlisting}
  public static int set(int, int);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=2, args_size=2
         0: iload_0       
         1: iconst_1      
         2: iload_1       
         3: ishl          
         4: ior           
         5: ireturn       

  public static int clear(int, int);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=2, args_size=2
         0: iload_0       
         1: iconst_1      
         2: iload_1       
         3: ishl          
         4: iconst_m1     
         5: ixor          
         6: iand          
         7: ireturn       
\end{lstlisting}


\TT{iconst\_m1} загружает $-1$ в стек, это то же что и значение \TT{0xFFFFFFFF}.

Операция XOR с \TT{0xFFFFFFFF} в одном из операндов, это тот же эффект что инвертирование всех бит (\myref{XOR_property}).


Попробуем также расширить все типы данных до 64-битного \IT{long}:

\begin{lstlisting}[style=customjava]
	public static long lset (long a, int b) 
	{
		return a | 1<<b;
	}

	public static long lclear (long a, int b) 
	{
		return a & (~(1<<b));
	}
\end{lstlisting}

\begin{lstlisting}
  public static long lset(long, int);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=4, locals=3, args_size=2
         0: lload_0       
         1: iconst_1      
         2: iload_2       
         3: ishl          
         4: i2l           
         5: lor           
         6: lreturn       

  public static long lclear(long, int);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=4, locals=3, args_size=2
         0: lload_0       
         1: iconst_1      
         2: iload_2       
         3: ishl          
         4: iconst_m1     
         5: ixor          
         6: i2l           
         7: land          
         8: lreturn       
\end{lstlisting}


Код такой же, но используются инструкции с префиксом \IT{l}, которые работают 
с 64-битными значениями.

Так же, второй аргумент функции все еще имеет тип \IT{int}, и когда 32-битное число в нем
должно быть расширено до 64-битного значения, используется инструкция \TT{i2l}, 
которая расширяет значение типа \IT{integer} в значение типа \IT{long}.
